//
// Created by Lenovo on 2021/12/21.
//

#ifndef SEQUENCE_STACK_SEQUENCE_STACK_H
#define SEQUENCE_STACK_SEQUENCE_STACK_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10   //存储空间分配增量

enum Status{OK=1,ERROR=-2,TRUE=1,FALSE=0,EMPTY=-1,OVERFLOW=-3};
typedef enum Status Status;

typedef int SElemType;  //自定义元素类型

typedef struct {

    SElemType *base;    //在栈构造之前和销毁之后，base的值为NULL
    SElemType *top;     //栈顶指针
    int StackSize;      //当前已分配的存储空间，以元素为单位
}SqStack;

Status InitStack(SqStack *S);   //构造一个空栈
Status DestroyStack(SqStack *S);    //销毁栈S，S不再存在
Status ClearStack(SqStack *S);  //把S置为空栈
Status StackEmpty(SqStack S);   //若S为空栈返回TRUE，否则返回FALSE
int StackLength(SqStack S);     //返回S的元素个数，即栈的长度
SElemType* GetTop(SqStack S);  //若栈不空，则返回栈顶元素，否则返回NULL
Status Push(SqStack *S,SElemType e);    //插入元素e为新的栈顶元素
SElemType* Pop(SqStack *S);  //若栈不空，则删除栈顶元素并返回，否则返回NULL
Status StackTraverse(SqStack S,Status (*visit)(SElemType));     //从栈底到栈顶一次对栈中每个元素调用函数visit（），一旦visit（）失败，则返回ERROR

#endif //SEQUENCE_STACK_SEQUENCE_STACK_H
